// socket.io需要下载依赖包
const {Server} = require('socket.io')
// http模块式nodejs的基础模块
const http = require('http')

//创建服务
const service = http.createServer()

// 升级成webscoekt协议
const IO = new Server(service, {
  // 配置你这个socket链接的接口路径
  path: '/socket'
})

// 简单定义一个聊天室,就是一个对象key就是用户id，value就是socket.id
let socketRoom = {}
//监听了连接成功的事件
// 得记录你这个用户的id并且针对你这个用户生成一socket实例
// socket实例就是用来发消息的
IO.on('connection', socket => {
  console.log('客户端链接我连接成功')
  const {meid} = socket.handshake.query

  // 只有有meid传过来的时候才把这个人加入到聊天室里面
  if(meid) {
    socketRoom[meid] = socket.id
  }
  console.log('当前聊天室里面有', socketRoom)


  // websocket是以事件的方式发送的消息
  // 在服务端注册（定义）事件，在客户端调用，在客户端调用的时候可以传一个参数
  socket.on('send', (res) => {
    // 别的地方调用这个事件的时候，穿的参数就是res
    console.log('调用这个方法的时候传了参数，是' + JSON.stringify(res))
    //到这里，服务端已经拿到了客户端发送的消息
    // 解析发送的消息，看一下你是要发给谁
    const {to} = res
    // to就是我要发送给的人的id
    // 在聊天室里面通过人的id找到这个人对应的socket.id

    const toSocketId = socketRoom[to]

    // 通过socket.to方法确认发送给谁
    // 通过触发事件发送消息
    // 触发的事件是在客户端注册的事件
    socket.to(toSocketId).emit('recive', res)
  })


  // 注册一个事件,不需要做特殊的处理
  socket.on('ping', () => {
    // 接收到ping事件之后，去触发客户端pang事件
    console.log('ping事件触发了')
    socket.emit('pang')
  })
})

//监听端口
service.listen(3000,() => {
  console.log('服务启动成功')
})



